package pl.edu.pw.mini.java2.Communicator.Client;

import java.io.*;
import java.util.concurrent.*;

/**
 * Klasa odpowiadająca za wysyłanie wiadomości do serwera aplikacji.
 * @author Dymitr Załunin, Kamil Łysik 
 */
public class WriterWorker extends Thread {
	private DataOutputStream output;
	private LinkedBlockingQueue<Message> buffer = new LinkedBlockingQueue<Message>();

	/**
	 * Konstruktor tworzący nową instancję obiektu.
	 * @param output Strumień wyjściowy.
	 */
	public WriterWorker(DataOutputStream output) {
		this.output = output;
	}

	/**
	 * Metoda przerywająca wątek do wysyłania wiadomości.
	 */
	public void close() {
		buffer.clear();
		this.interrupt();
		try {
			output.close();
		} catch (IOException e) {
		}
		output = null;
	}

	/**
	 * Metoda uruchamiająca wątek do wysyłania wiadomości do serwera. Jest uruchamiana automatycznie
	 * przy wywołaniu metody Thread.start().
	 */
	@Override
	public void run() {
		try {
			while (true) {
				buffer.take().send(output);
			}
		} catch (InterruptedException ex) {
			System.out.println("Interrupted Exception in writer!");
		} catch (IOException ex) {
			System.out.println("IO error In client writer!");
			//ex.printStackTrace();
		}
	}

	/**
	 * Metoda dodająca wiadomość do kolejki wiadmości.
	 * @param m Wiadomość do wysłania.
	 */
	public void sendMessage(Message m) {
		try {
			buffer.put(m);
		} catch (InterruptedException ignored) {
		}
	}
}
